# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/8/21
# @File : D - Querying Multiset.py
# https://atcoder.jp/contests/abc212/editorial/2370

from heapq import heappop, heappush


# 优先队列 priority queues
def solve():
    heap = []
    temp_offset = 0  # 记录前缀和
    for i in range(Q):
        if (opt[i][0] == 1):
            heappush(heap, opt[i][1] - temp_offset)
        elif (opt[i][0] == 2):
            temp_offset += opt[i][1]
        else:
            print(heappop(heap) + temp_offset)  # 从堆中弹出最小的元素
    return 0


"""
1.采用直接模拟的做法必然会TLE。

2.AC：数据结构必须采用heapq，是一种优先队列，可以从堆中弹出最小的元素。

3.思路：https://atcoder.jp/contests/abc212/editorial/2370

        o（1）处理操作二；
        X_i+(S_K-S_i)=(X_i-S_i)+S_K
        因为会有一系列的操作二，对于每个袋子里面的球，这一系列操作二对他们的影响是X_i+(S_K-S_i)
        转换公式为(X_i-S_i)+S_K，就代表遇到操作三（假设K的操作为操作三）之前，遇到操作二都是累加前缀和S，
        遇到操作一就是X减去当前的S入队，因为在这之前的操作二都不影响这个操作一的球

        而且S_K与球无关

        整体时间复杂度：O(Q*log Q) 有点像时间序列上的差分前缀和

"""

if __name__ == "__main__":
    Q = int(input())
    opt = []
    for _ in range(Q):
        seq = [int(i) for i in input().split()]
        opt.append(seq)
    solve()
